package org.dei.perla.context;

import java.util.ArrayList;
import java.util.Set;
import org.dei.perla.parser.expressions.*;



public abstract class Value {

	private Set<Constant<?>> valueSensors;
	private String nome;
	private DimensionStructure dimension;
	private String dimstring;
	private ArrayList<DimensionStructure> dimFiglie;

	/**
	 * Costruttore di un valore generico
	 * @param nome : nome del valore
	 * @param dimension : nome della dimensione associata al valore
	 */
	
	public Value(String nome, String dimension)
	{
		//try {
		this.nome= nome;
		/*if(!nome.equals("root"))
		{
			this.cdt= CDT.getDefault();
			this.dimension= cdt.getDimensionByName(dimension);
		}*/
		this.dimFiglie= new ArrayList<DimensionStructure>();
		/*} catch (NotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}*/
	}
	
	/**
	 * @return Restituisce il nome del valore
	 */
	public String getNome() {
		return nome;
	}

	/**
	 * Setta il nome del valore
	 * @param nome : nome del valore
	 */
	public void setNome(String nome) {
		this.nome = nome;
	}
	
	/**
	 * @return ritorna il Set<Constant<?>> contenente i sensori che partecipano a quel valore
	 */
	public Set<Constant<?>> getValueSensors() {
		return valueSensors;
	}

	/**
	 * Collega i sensori alla dimensione
	 * @param valueSensors insieme contentente i sensori
	 */
	public void setValueSensors(Set<Constant<?>> valueSensors) {
		this.valueSensors = valueSensors;
	}

	/**
	 * Calcola automaticamente l'insieme dei sensori che soddisfano le condizioni del valore
	 */
	public abstract void calcolaSet();

	/**
	 * Collega un valore ad una dimensione
	 * @param dim dimensione che deve essere collegata al valore
	 */
	public void setDimension(DimensionStructure dim){
		dimension = dim;
		this.EreditaCondizione();
		
	}
	
	/**
	 * Metodo che permette di ereditare le condizioni che derivano dal padre della dimensione
	 */
	public void EreditaCondizione(){
		this.setCondition(this.getCondition() + " AND " + this.getDimension().getPadre().getCondition());
	}
	
	/**
	 * @return restituisce la dimensione associata al valore
	 */
	public DimensionStructure getDimension(){
		return dimension;
	}
	
	
	public void setDimension(String dim){
		this.dimstring=dim;
	}
	
	public String getDimensionString(){
		return dimstring;
	}
	
	/**
	 * @return restituisce una lista di dimensioni che hanno come padre il valore seguente
	 */
	public ArrayList<DimensionStructure> getDimFiglie() {
		return dimFiglie;
	}

	/**
	 * collega una lista di dimensioni al valore
	 * @param dimFiglie lista di dimensioni
	 */
	public void setDimFiglie(ArrayList<DimensionStructure> dimFiglie) {
		this.dimFiglie = dimFiglie;
	}
	
	/**
	 * @return ritorna la stringa che determina la condizione del valore
	 */
	public abstract String getCondition();
	/**
	 * imposta la condizione del valore
	 * @param condition stringa che indica la condizione
	 */
	public abstract void setCondition(String condition);
	
	public String toString(){
		return " ";
	}
	
}
